package gestorHotel.reserva;

import gestorHotel.Hotel;
import gestorHotel.servicios.Minibar;
import gestorHotel.usuarios.*;
import gestorHotel.factura.*;
import gestorHotel.habitacion.Habitacion;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

import uiMain.menuconsola.Main;

public class Reserva {
	private String fechaEntrada;
	private String fechaReserva;
	private int numNoches;
	private TipoEstadoReserva estado;
	private int numPersonas;
	private ArrayList<LineaReserva> lineas;
	private String usuario;
	private int codReserva;
	private Factura factura = null;
	
	public Reserva() {
		this.fechaEntrada = null;
		this.fechaReserva = null;
		this.numNoches = 0;
		this.estado = TipoEstadoReserva.ACTIVA;
		this.numNoches = 0;
		this.lineas = new ArrayList<LineaReserva>();
		this.usuario = null;
		this.codReserva = 0;
	}
	
	public Reserva(String fechaEntrada, String fechaReserva, int numNoches, 
			TipoEstadoReserva estado, int numPersonas, ArrayList<LineaReserva> lineas,
			String usuario, int codReserva) {
		this.fechaEntrada = fechaEntrada;
		this.fechaReserva = fechaReserva;
		this.numNoches = numNoches;
		this.estado = estado;
		this.numPersonas = numPersonas;
		this.lineas = lineas;
		this.usuario = usuario;
		this.codReserva = codReserva;
	}
	
	public Reserva(String fechaEntrada, String fechaReserva, int numNoches, 
			TipoEstadoReserva estado, int numPersonas, ArrayList<LineaReserva> lineas,
			String usuario, int codReserva, Factura factura) {
		this.fechaEntrada = fechaEntrada;
		this.fechaReserva = fechaReserva;
		this.numNoches = numNoches;
		this.estado = estado;
		this.numPersonas = numPersonas;
		this.lineas = lineas;
		this.usuario = usuario;
		this.codReserva = codReserva;
		this.factura = factura;
	}
	
	public String getFechaEntrada() {
		return this.fechaEntrada;
	}
	
	public String getFechaReserva() {
		return this.fechaReserva;
	}
	
	public int getNumNoches() {
		return this.numNoches;
	}
	
	public TipoEstadoReserva getEstado() {
		return this.estado;
	}
	
	public int getNumPersonas() {
		return this.numPersonas;
	}
	
	public ArrayList<LineaReserva> getLineas() {
		return lineas;
	}
	
	public String getUsuario() {
		return usuario;
	}
	
	public void setFechaEntrada(String fechaEntrada) {
		this.fechaEntrada = fechaEntrada;
	}
	
	public void setFechaReserva(String fechaReserva) {
		this.fechaReserva = fechaReserva;
	}
	
	public void setNumNoches(int numNoches) {
		this.numNoches = numNoches;
	}
	
	public void setEstado(TipoEstadoReserva estado) {
		this.estado = estado;
	}
	
	public void setNumPersonas(int numPersonas) {
		this.numPersonas = numPersonas;
	}
	
	public void setLineas(ArrayList<LineaReserva> lineas) {
		this.lineas = lineas;
	}
	
	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}
	
	public void crear(String h) {
		if (!Main.hoteles.get(h).getReservas().containsKey(this.codReserva))
			Main.hoteles.get(h).getReservas().put(this.codReserva, this);
	}
	
	public void eliminar(String h) {
		if (Main.hoteles.get(h).getReservas().containsKey(this.codReserva))
			Main.hoteles.get(h).getReservas().remove(this.codReserva);
	}
	
	public void editar(String h) {
		if (Main.hoteles.get(h).getReservas().containsKey(this.codReserva))
			Main.hoteles.get(h).getReservas().put(this.codReserva, this);
	}
	
	public void mostrar() {
		System.out.println();
		System.out.println("Código de reserva: " + this.codReserva);
		System.out.println("Fecha de entrada: " + this.fechaEntrada);
		System.out.println("Fecha de reserva: " + this.fechaReserva);
		System.out.println("Número de noches: " + this.numNoches);
		System.out.println("Usuario: " + this.usuario);
		System.out.println("Estado: " + this.estado);
	}

	public int getCodReserva() {
		return codReserva;
	}

	public void setCodReserva(int codReserva) {
		this.codReserva = codReserva;
	}

	public String generarFactura(String h) {
		this.factura = new Factura();
		
		Date fecha = new Date();
		this.factura.setFecha(fecha.toString());
		
		if (this.estado == TipoEstadoReserva.CANCELADA) {
			int dias = 3; // CAMBIAR
			ArrayList<PenalizacionCancelacion> penalizaciones = Main.hoteles.get(h).getPenalizaciones();
			PenalizacionCancelacion penalizacion = null;
			for (PenalizacionCancelacion p : penalizaciones)
				if (dias >= p.getAntesDe()) {
					penalizacion = p;
					break;
				}
			this.factura.agregarLinea("Cancelación", 1, penalizacion.getCoste());
		} else {
			Hotel hotel = Main.hoteles.get(h);
			Habitacion habitacion = hotel.getHabitaciones().get(this.lineas.get(0).getHabitacion());
			double precioTipo = hotel.getTipos().get(habitacion.getTipo()).getPrecio();
			double suplemento = hotel.getCategorias().get(habitacion.getCategoria()).getSuplemento();
			double precioAlojamiento = this.numNoches * precioTipo * suplemento;
			
			this.factura.agregarLinea("Alojamiento", 1, precioAlojamiento);
			
			this.factura.agregarLinea("Internet", habitacion.getMinutosInternet(), hotel.getServicios().get("internet").getPrecio() * suplemento);
			this.factura.agregarLinea("Minutos internacionales", habitacion.getMinutosInternacionales(), hotel.getServicios().get("internacional").getPrecio() * suplemento);
			this.factura.agregarLinea("Minutos nacionales", habitacion.getMinutosNacionales(), hotel.getServicios().get("nacional").getPrecio() * suplemento);
			
			for (Minibar minibar : habitacion.getMinibar()) {
				this.factura.agregarLinea(minibar.getBebidas(), minibar.getCantidad(), hotel.getBebidas().get(minibar.getBebidas()).getPrecio() * suplemento);
			}
		}
		
		return this.factura.toString();
	}

	public Factura getFactura() {
		return factura;
	}

	public void setFactura(Factura factura) {
		this.factura = factura;
	}
}
